package com.itheima.util;

import org.apache.ibatis.session.SqlSession;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Dao {
    //获得mapper的代理对象

    /**
     * @param <T> 定义泛型任何对象的mapper对象都可以使用
     * @param objMapper 传入需要得到代理对象的的mapper的class类对象
     * @return mapperImpl  返回的是代理对象
     */
    public static <T> T getMapper(Class<T> objMapper){

        //传入mapper的class类对象
        Object proxy = Proxy.newProxyInstance(
                /*获得当前类的类加载器(我们自己写的类用的都是同一个类加载器,所以只要是我们自己写的类
                都可以用在这里获得类加载器)*/
                Dao.class.getClassLoader(),
                //代理对象实现的全部接口
                new Class[]{objMapper},
                new InvocationHandler() {
                    @Override
                    //代理对象      当前执行的方法     当前方法的参数
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //获取会话  自动提交事务的会话
                        SqlSession session = MyBatisUtils.getSession(true);
                        //获得mapper对象
                        T mapper = session.getMapper(objMapper);
                        //执行当前的方法
                        Object result = method.invoke(mapper, args);
                        //关闭会话
                        session.close();
                        return result;
                    }
                }
        );
        //转化类型
        T mapperImpl = (T)proxy;
        //返回代理对象
        return mapperImpl;
    }
}
